const fs = require('fs');
const path = require('path');

// 配置
const config = {
  excludeDirs: ['.git', 'node_modules', 'img'], // 要排除的文件夹
  excludeFiles: ['README.md'],                  // 要排除的文件
  outputFile: 'README.md',                      // 输出的目录文件
  dateFormat: 'YYYY/MM/DD'                      // 日期格式
};

// 生成目录
function generateTOC() {
  let content = `# blog\n\n#### 介绍\n\n**全玉老师的博客**\n`;
	// 添加生成日期
  const today = new Date();
  const formattedDate = `${today.getFullYear()}/${String(today.getMonth() + 1).padStart(2, '0')}/${String(today.getDate()).padStart(2, '0')}`;
  content += `update @ ${formattedDate}\n\n`;
	
  let folderCounter = 0;

  // 获取所有文件夹（排序并过滤）
  const folders = getDirectories('./')
    .filter(dir => !config.excludeDirs.includes(path.basename(dir)))
    .sort();

  // 处理每个文件夹
  folders.forEach(folder => {
    folderCounter++;
    let fileCounter = 0;
    const folderName = path.basename(folder);
    
    // 获取文件夹下的 Markdown 文件（排序并过滤）
    const files = getMarkdownFiles(folder)
      .filter(file => !config.excludeFiles.includes(path.basename(file)))
      .sort();

    if (files.length > 0) {
      // 添加文件夹标题
      content += `### ${folderCounter}. ${folderName}\n`;

      // 添加文件列表
      files.forEach(file => {
        fileCounter++;
        const fileName = path.basename(file, '.md');
        const relativePath = path.relative('./', file).replace(/\\/g, '/');
        
        content += `${folderCounter}.${fileCounter} [${fileName}](${encodeURI(relativePath)})\n`;
      });

      content += '\n';
    }
  });

  // 写入文件
  fs.writeFileSync(config.outputFile, content);
  console.log(`目录已生成到 ${config.outputFile}`);
}

// 获取子目录
function getDirectories(dir) {
  return fs.readdirSync(dir, { withFileTypes: true })
    .filter(dirent => dirent.isDirectory())
    .map(dirent => path.join(dir, dirent.name));
}

// 获取 Markdown 文件
function getMarkdownFiles(dir) {
  try {
    return fs.readdirSync(dir)
      .filter(file => file.endsWith('.md'))
      .map(file => path.join(dir, file));
  } catch (e) {
    return []; // 忽略无法读取的目录
  }
}

// 执行生成
generateTOC();